#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：sql语句构建.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2025/1/2 下午3:22 
"""

import re


def escape_value(value):
	"""用于转义SQL中的特殊字符，例如引号"""
	if isinstance(value, str):
		return value.replace("'", "''")  # SQL中的字符串需要将单引号转义为两个单引号
	return str(value)  # 对于其他类型，直接转为字符串


def build_insert_sql(table_name, insert_data_dict):
	"""
	构建一个INSERT SQL语句
	:param table_name: 数据表名
	:param insert_data_dict: 字段和值的字典，键为字段名，值为对应的字段值
	:return: 构建的SQL语句
	"""
	if not isinstance(insert_data_dict, dict):
		raise ValueError("insert_data_dict 应该是一个字典类型")

	if not insert_data_dict:
		raise ValueError("insert_data_dict 不能为空")

	# 获取字段名和对应的值
	insert_fields = list(insert_data_dict.keys())
	insert_values = list(insert_data_dict.values())

	# 校验字段和值的数量是否匹配
	if len(insert_fields) != len(insert_values):
		raise ValueError(f"字段数量({len(insert_fields)})与值数量({len(insert_values)})不匹配")

	# 构建字段字符串
	insert_field_str = ', '.join(insert_fields)

	# 构建值字符串
	insert_values_str = ', '.join(
		"NULL" if value is None else f"'{escape_value(value)}'" if isinstance(value, str) else str(value)
		for value in insert_values
	)

	# 生成完整的INSERT语句
	insert_sql_string = f"INSERT INTO {table_name} ({insert_field_str}) VALUES ({insert_values_str})"

	return insert_sql_string


try:
	insert_data_dict = {
		"name": "Alice",
		"age": 25,
		"address": None
	}

	sql = build_insert_sql("users", insert_data_dict)
	print(sql)
except ValueError as e:
	print(f"Error: {e}")
